#include "fsl_lpuart.h"
#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "boot_drv.h"


static lpuart_config_t lpuart1_config;

int mbl_send_byte(char ch)
{
    while ((LPUART1->STAT & LPUART_STAT_TDRE_MASK) == 0);
    LPUART1->DATA = (unsigned char)ch;
    return 0;
}

int mbl_recv_byte(unsigned char *c, int timeout)
{
    int t;
    t = timeout * 5000;
    //RXNE
    while (t--)
    {
        if ((LPUART1->STAT)&kLPUART_RxDataRegFullFlag)
        {
            *c = (unsigned char)LPUART1->DATA; //读取数据
            return 0;
        }
    }
    return -1;
}


//获取LPUART的时钟源频率，我们前面设置的是80MHz
//返回值：LPUART时钟源频率,根据我们的只是一般是80Mhz
unsigned int LPUART_SrcFreqGet(void)
{
    uint32_t freq;

    if (CLOCK_GetMux(kCLOCK_UartMux) == 0)  //LPUART的时钟源选择PLL3/6
    {
        freq = (CLOCK_GetPllFreq(kCLOCK_PllUsb1) / 6U) / (CLOCK_GetDiv(kCLOCK_UartDiv) + 1U);
    }
    else                                    //LPUART的时钟源选择OSC
    {
        freq = CLOCK_GetOscFreq() / (CLOCK_GetDiv(kCLOCK_UartDiv) + 1U);
    }
    return freq;
}

//初始化IO 串口1
//bound:波特率
void LPUART1_Init(unsigned int bound)
{
    unsigned int freq = 0;                          //串口的时钟源频率

    CLOCK_EnableClock(kCLOCK_Lpuart1);  //使能LPUART1时钟

    CLOCK_SetMux(kCLOCK_UartMux, 0);    //设置UART时钟源为PLL3 80Mhz，PLL3/6=480/6=80MHz
    CLOCK_SetDiv(kCLOCK_UartDiv, 0);  //设置UART时钟1分频，即UART时钟为80Mhz

    //LPUART1所使用的IO功能配置，即：从ALT0~ALT7选择合适的功能。
    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0U);  //GPIO_AD_B0_12设置为LPUART1_TX
    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0U);  //GPIO_AD_B0_13设置为LPUART1_RX

    //配置IO引脚GPIO_AD_B0_12和GPIO_AD_B0_13的功能
    //低转换速度,驱动能力为R0/6,速度为100Mhz，关闭开路功能，使能pull/keepr
    //选择keeper功能，下拉100K Ohm，关闭Hyst
    IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0x10B0u);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0x10B0u);

    freq = LPUART_SrcFreqGet();

    LPUART_GetDefaultConfig(&lpuart1_config);                 //先设置为默认配置，后面在根据实际情况配置

    //初始化NXP官方提供的debug console，此函数会重新初始化LPUART1，但是我们后面会
    //重新显示的初始化一次LPUART1，DbgConsole_Init()主要是给那些想要使用NXP官方
    //调试功能的开发者使用的，不需要使用的话就可以将下面代码注释掉
    //DbgConsole_Init(BOARD_DEBUG_UART_BASEADDR,bound,BOARD_DEBUG_UART_TYPE,freq);

    lpuart1_config.baudRate_Bps = bound;                                //波特率
    lpuart1_config.dataBitsCount = kLPUART_EightDataBits; //8位
    lpuart1_config.stopBitCount = kLPUART_OneStopBit;       //1位停止位
    lpuart1_config.parityMode = kLPUART_ParityDisabled;     //无奇偶校验
    lpuart1_config.enableRx = true;                                             //使能接收
    lpuart1_config.enableTx = true;                                             //使能发送
    LPUART_Init(LPUART1, &lpuart1_config, freq);              //初始化LPUART1
}
















